#ifndef GAMEMODEL_H
#define GAMEMODEL_H

// ---- 五子棋游戏模型类 ---- //
#include <vector>
#include <time.h>
#include <QtGlobal>

using namespace std;

// 游戏类型，双人还是AI（目前固定让AI下黑子）
enum GameType
{
    PERSON,
    AI
};

// 游戏状态
enum GameStatus
{
    PLAYING,
    WIN,
    DEAD
};


#define KBOARD_SIZE_NUM     15  // 棋盘尺寸
#define MARGIN              30  // 棋盘边缘空隙
#define CHESS_RADIUS        15  // 棋子半径
#define MARK_SIZE           10  // 落子标记边长
#define BLOCK_SIZE          40  // 格子边长
#define FUZZY_DISTANCE      20  // 鼠标预点击的模糊距离上限
#define AI_DELAY            1000// AI下棋的思考时间
#define ATTACK_POWER        0.9 // AI进攻性

//决策树
struct TreeNode {
    int value;
    std::vector<TreeNode*> children;
};

class GameModel;

class CtlTree{
    GameModel* gameModel;
    TreeNode* buildDecisionTree(int depth);
};

class GameModel
{
public:
    GameModel();

public:
    std::vector<std::vector<int>> gameMapVec;   // 存储当前游戏棋盘和棋子的情况,空白为0，白子1，黑子-1
    std::vector<std::vector<int>> scoreMapVec;  // 存储各个点位的评分情况，作为AI下棋依据
    bool playerFlag;        // 标示下棋方:false——黑子 true——白子
    GameType gameType;      // 游戏模式
    GameStatus gameStatus;  // 游戏状态

    void startGame(GameType type);                  // 开始游戏
    void calculateScore();                          // 计算评分
    void actionByPerson(int row, int col);          // 人执行下棋
    void actionByAI(int &clickRow, int &clickCol);  // 机器执行下棋
    void updateGameMap(int row, int col);           // 每次落子后更新游戏棋盘
    int negamax_alpha_beta(vector<vector<int>> state,int row,int col, int depth, int alpha, int beta);

    bool isWin(int row, int col);                   // 判断游戏是否胜利
    bool isDeadGame();                              // 判断是否和棋
};

#endif // GAMEMODEL_H
